﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using ECOSYSTEM_Dominio;

namespace ECOSYSTEM_DAL
{
    public class FacturaDAL
    {
        SqlConnection cnn;
        Int32 CodFacturaID;
        public Int32 guardarFactura(Factura laFactura) { 
             try
            {
                 cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                 cnn.Open();
                 SqlCommand cmd = new SqlCommand("RegistrarFactura",cnn);
                 cmd.CommandType = CommandType.StoredProcedure;
                 cmd.Parameters.AddWithValue("NroFactura",laFactura.NroFactura);
                 cmd.Parameters.AddWithValue("FecEmision",laFactura.FecEmisionFac);
                 cmd.Parameters.AddWithValue("Moneda",laFactura.MonedaFac);
                 cmd.Parameters.AddWithValue("TCambioFact",laFactura.TCambioFac);
                 cmd.Parameters.AddWithValue("TCancelacionFact",laFactura.TCancelacionFac);
                 cmd.Parameters.AddWithValue("SubTotalFact",laFactura.SubTotalFac);
                 cmd.Parameters.AddWithValue("IGVFact",laFactura.IGVFact);
                 cmd.Parameters.AddWithValue("TotalFact",laFactura.TotalFac);
                 cmd.Parameters.AddWithValue("PagoCon",laFactura.PagoCon);
                 cmd.Parameters.AddWithValue("NroDiasPlaso",laFactura.NroDiasPlaso);
                 cmd.Parameters.AddWithValue("Estado",laFactura.Estado);
                 //cmd.Parameters.AddWithValue("UsuarioID",laFactura.ElUsuario);
                 cmd.Parameters.AddWithValue("NroGuia",laFactura.LaGuiaRemision);
                 cmd.Parameters.AddWithValue("RUCCLiente",laFactura.ElCliente);
                 SqlDataReader dr = cmd.ExecuteReader();
                 while (dr.Read())
                 {
                     CodFacturaID = Convert.ToInt32(dr["CodFacturaID"]);
                 }
            }
             catch (SqlException ex) { throw new Exception(ex.Message); }
             catch (Exception e) { throw new Exception(e.Message); }
             finally
             {
                 if (cnn.State == ConnectionState.Open)
                 {
                     cnn.Close();
                 }
             }
             return CodFacturaID;
        }
        public Boolean ActualizarFactura(Factura laFactura, Int32 IDFactura, String NroFactura)
        {
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("ActualizarFactura", cnn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("IDFactura", IDFactura);
                cmd.Parameters.AddWithValue("NroFacturaNueva", laFactura.NroFactura);
                cmd.Parameters.AddWithValue("NroFacturaComparar", NroFactura);
                cmd.Parameters.AddWithValue("FecEmision", laFactura.FecEmisionFac);
                cmd.Parameters.AddWithValue("Moneda", laFactura.MonedaFac);
                cmd.Parameters.AddWithValue("TCambioFact", laFactura.TCambioFac);
                cmd.Parameters.AddWithValue("TCancelacionFact", laFactura.TCancelacionFac);
                cmd.Parameters.AddWithValue("SubTotalFact", laFactura.SubTotalFac);
                cmd.Parameters.AddWithValue("IGVFact", laFactura.IGVFact);
                cmd.Parameters.AddWithValue("TotalFact", laFactura.TotalFac);
                cmd.Parameters.AddWithValue("PagoCon", laFactura.PagoCon);
                cmd.Parameters.AddWithValue("NroDiasPlaso", laFactura.NroDiasPlaso);
                cmd.Parameters.AddWithValue("Estado", laFactura.Estado);
                //cmd.Parameters.AddWithValue("UsuarioID",laFactura.ElUsuario);
                cmd.Parameters.AddWithValue("NroGuia", laFactura.LaGuiaRemision);
                cmd.Parameters.AddWithValue("RUCCLiente", laFactura.ElCliente);
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return true;
        }
        public Boolean guardarDetalleFacturaProducto(Factura.DetalleFacturaProducto elDetalleFacturaProducto) {
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("RegistrarDetalleFacturaProducto", cnn);
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.AddWithValue("PrecioVenProd",elDetalleFacturaProducto.PrecioVenta);
                cmd.Parameters.AddWithValue("CantidadProd",elDetalleFacturaProducto.CantidadProd);
                cmd.Parameters.AddWithValue("IDProducto", elDetalleFacturaProducto.ProductoID);
                cmd.Parameters.AddWithValue("IDFactura",elDetalleFacturaProducto.FacturaID);
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
             finally
             {
                 if (cnn.State == ConnectionState.Open)
                 {
                     cnn.Close();
                 }
             }
             return true;
        }
        public Boolean ActualizarDetalleFacturaProducto(Factura.DetalleFacturaProducto elDetalleFacturaProducto)
        {
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("ActualizarDetalleFacturaProducto", cnn);
                cmd.CommandType = CommandType.StoredProcedure;

                cmd.Parameters.AddWithValue("PrecioVenProd", elDetalleFacturaProducto.PrecioVenta);
                cmd.Parameters.AddWithValue("Cantidad", elDetalleFacturaProducto.CantidadProd);
                cmd.Parameters.AddWithValue("IDProducto", elDetalleFacturaProducto.ProductoID);
                cmd.Parameters.AddWithValue("IDFactura", elDetalleFacturaProducto.FacturaID);
                cmd.ExecuteNonQuery();
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return true;
        }
        public Boolean EliminarProductoRegistradoDeDetalleFactura(Int32 IDFact, Int32 IDProd) { 
             try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("EliminarProductoRegistradoDeDetalleFactura", cnn);
                cmd.Parameters.AddWithValue("IDFact", IDFact);
                cmd.Parameters.AddWithValue("IDProd", IDProd);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.ExecuteNonQuery();
            }
             catch (SqlException ex) { throw new Exception(ex.Message); }
             catch (Exception e) { throw new Exception(e.Message); }
             finally
             {
                 if (cnn.State == ConnectionState.Open)
                 {
                     cnn.Close();
                 }
             }
             return true;
        }
        public DataTable ObtenerListaFacturasEmitidas(String FecEmision)
        {
            DataTable lista = null;
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlDataAdapter da = new SqlDataAdapter("ObtenerListaFacturas", cnn);
                da.SelectCommand.CommandType = CommandType.StoredProcedure;
                da.SelectCommand.Parameters.AddWithValue("Fecha", FecEmision);
                lista = new DataTable();
                da.Fill(lista);
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
            return lista;
        }
        public List<Factura.DetalleFacturaProducto> ObtenerDetalleFacturaEmitida(Int32 FacturaID)
        {
            List<Factura.DetalleFacturaProducto> lista;
            try
            {
                cnn = (SqlConnection)ConexionSQL.getInstancia().getConexion();
                cnn.Open();
                SqlCommand cmd = new SqlCommand("ObtenerDetalleFacturaEmitida", cnn);
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.AddWithValue("FacturaID",FacturaID);
                lista = new List<Factura.DetalleFacturaProducto>();
                SqlDataReader dr = cmd.ExecuteReader();
                while (dr.Read())
                {
                    Factura.DetalleFacturaProducto elDetalle = new Factura.DetalleFacturaProducto();
                    elDetalle.CantidadProd = Convert.ToInt32(dr["Cantidad"]);
                    elDetalle.NameProduc = dr["NameProduc"].ToString();
                    elDetalle.PrecioVenta = Convert.ToDouble(dr["PrecioVenta"]);
                    elDetalle.ProductoID = Convert.ToInt32(dr["ProductoID"]);
                    lista.Add(elDetalle);
                }
                return lista;
            }
            catch (SqlException ex) { throw new Exception(ex.Message); }
            catch (Exception e) { throw new Exception(e.Message); }
            finally
            {
                if (cnn.State == ConnectionState.Open)
                {
                    cnn.Close();
                }
            }
        }
    }
}
